[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
1 はじめに
IoT事業部の平内(SIN)です。
前回、AWS IoT Greengrass V2(以下、Greengrass V2)のコンポーネントをローカルでデプロイしてみました。
今回は、上記でローカルにデプロイしたものを一旦削除し、同じコンポーネントをクラウド側からデプロイしてみました。
なお、複数のデバイスにデプロイできる事を確認するために、同じグループでもう一台、コアデバイス(gg-device-002)を追加して作業を進めました。
2 アーティファクト
ローカルでのデプロイと違って、アーティファクト(複数のスクリプト、バイナリ、静的リソースなど)は、S3バケットに配置します。
(1) S3バケットへの配置
フォルダ構成は、ローカルの時と同じですが、この形式でS3バケットにアップロードします。
バケット(名前をgg_artifacts-2021-08-11としました)を作成し、アーティファクトを配置した様子です。
(2) S3バケットへのアクセス権
Greengrass V2では、ロールエリアス経由で、IAMポリシーとしてGreengrassV2TokenExchangeRoleAccessが設定されていますが、デフォルトでは、作成したバケットへのパーミッションがありません。
そこで、新たに、作成したバケットへのアクセス権を付与するため、下記のようなポリシーを作成し、上記のロールに追加しています。
gg-policy-2021-08-11
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::gg-artifacts-2021-08-11/*" } ] }
追記
2023/01/05現在、 s3:GetObject の他に、 s3:GetBucketLocation が必要です。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::gg-artifacts-2021-08-11/*" }, { "Effect": "Allow", "Action": [ "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::gg-artifacts-2021-08-11" } ] }
3 レシピ
AWS IoTのコンソールから、Greengrass - コンポーネント - コンポーネントを作成 - レシピをYAMLとして入力すると辿ります。
設定したYAMLは、以下の通りですが、ローカルで使用したものの Artifacts: - Uri: をS3のパスに変更しただけのものです。
--- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.HelloWorld ComponentVersion: 1.0.0 ComponentDescription: My first Greengrass component. ComponentPublisher: Me ComponentConfiguration: DefaultConfiguration: Message: world Manifests: - Name: Linux Platform: os: linux Lifecycle: Run: | python3 {artifacts:path}/hello_world.py '{configuration:/Message}' Artifacts: - Uri: s3://gg-artifacts-2021-08-11/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
画面一番下の「コンポーネントを作成」をクリックするとコンポーネントの作成は完了です。
4 デプロイ
作成したコンポーネントを開くと、右上の「デプロイ」が利用可能になっています。
デプロイは、「既存のデプロイに追加」と「新しいデプロイを作成」の2種類から選択可能です。(「新しいデプロイを作成」を選択した場合、既存のコンポーネントは、いったんクリアされますので、注意が必要です)
今回は、インストール時に使用されたデプロイを選択したので、当該グループに所属する全てのコアデバイスがデプロイ対象となります。
デプロイ設定のステップ1〜5は、特に変更が必要なければ「次へ」だけで進めても問題ありません。
デプロイが完了したかどうかは、それぞれのコアデバイスでコンポーネントのタブから確認できます。
5 確認
下記は、コアデバイスで、Greengrass CLIを使用して、コンポーネントの一覧を確認している様子です。
pi@device-001:~ $ sudo /greengrass/v2/bin/greengrass-cli component list ・・・略・・・ Component Name: com.example.HelloWorld Version: 1.0.0 State: FINISHED Configuration: {"Message":"world"} ・・・略・・・
hello_world.pyが出力するログも確認できています。
pi@device-001:~ $ tail -f /tmp/Greengrass_HelloWorld.log Hello, world! Current time: 2021-08-11 12:56:26.796150.
6 複数デバイス
最初に書いた通り、所属するグループには、もう一台のコアデバイス(gg-device-002)が追加されています。
先のデプロイで、もう一台にも同じコンポーネントが動作していることを確認できました。
pi@device-002:~ $ sudo /greengrass/v2/bin/greengrass-cli component list ・・・略・・・ Component Name: com.example.HelloWorld Version: 1.0.0 State: FINISHED Configuration: {"Message":"world"} ・・・略・・・
pi@device-002:~ $ tail -f /tmp/Greengrass_HelloWorld.log Hello, world! Current time: 2021-08-11 12:56:28.183961.
7 最後に
今回は、クラウド側から複数のデバイスに対してコンポーネントをデプロイしてみました。 単なるスクリプトを配布できると意味では、エッジデバイスへのデプロイ環境としても有効だと感じました。
8 参考リンク
[AWS IoT Greengrass V2] RaspberryPIにインストールしてみました
[AWS IoT Greengrass V2] RaspberryPIでコンポーネントを作成してみました
[AWS IoT Greengrass V2] クラウド側から複数のコアデバイスにコンポーネントをデプロイしてみました
[AWS IoT Greengrass V2] クラウド側からコンポーネントを削除してみました
[AWS IoT Greengrass V2] ローカルデバッグコンソール(aws.greengrass.LocalDebugConsole)を使用してみました
[AWS IoT Greengrass V2] Lambda関数(コンポーネント)をデプロイしてみました
[AWS IoT Greengrass V2] コンポーネントからIoT CoreのメッセージブローカーにPublish/Subscribeしてみました
[AWS IoT Greengrass V2] コンポーネントからシークレットマネージャにアクセスしてみました